package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.Region;
import cn.wolfcode.wolf2w.exception.LogicException;
import cn.wolfcode.wolf2w.query.RegionQuery;
import cn.wolfcode.wolf2w.repository.RegionRepository;
import cn.wolfcode.wolf2w.service.IRegionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 区域业务层的实现类
 */
@Service
public class RegionServiceImpl implements IRegionService {

    //  注入RegionRepository持久层接口
    @Autowired
    private RegionRepository regionRepository;

    //  注入MongoTemplate服务
    @Autowired
    private MongoTemplate mongoTemplate;

    //  插入单个方法
    @Override
    public void insert(Region region) {

        //  id自动生成，手动设置为空
        region.setId(null);

        if (region.getSequence() != null) {

            //  调用持久层接口的save方法执行插入单个目的地对象
            regionRepository.save(region);
        } else {
            throw new LogicException("序号不能为空");
        }

    }

    //  删除单个方法
    @Override
    public void deleteById(String id) {

        //  调用持久层接口的deleteById方法执行删除单个目的地对象
        regionRepository.deleteById(id);
    }

    //  修改单个方法
    @Override
    public void updateById(Region region) {

        //  调用持久层接口的save方法执行修改单个目的地对象
        regionRepository.save(region);
    }

    //  查询单个方法
    @Override
    public Region selectById(String id) {

        //  调用持久层接口的findById方法执行查询单个目的地对象
        return regionRepository.findById(id).orElse(null);
    }

    //  查询所有方法
    @Override
    public List<Region> selectAll() {

        //  调用持久层接口的findAll方法执行查询所有目的地对象
        return regionRepository.findAll();
    }

    //  分页方法
    @Override
    public Page<Region> query(RegionQuery qo) {

        //  查询对象
        Query query = new Query();

        //  调用mongodb服务中的count方法
        //  传入上面的查询对象和Region的字节码对象
        //  返回一个满足条件的总记录数
        long totalCount = mongoTemplate.count(query, Region.class);

        //  若查询出来的总记录数为零时
        if (totalCount == 0) {

            //  直接返回一个空集合
            return Page.empty();
        }

        //  调用Pageable的of方法
        //  传入qo对象的当前页，qo对象的当前页显示的最大记录数，排序的顺序，通过_id来排序
        Pageable pageRequest = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.ASC, "_id");

        //  把限制条件加入到查询对象中
        query.with(pageRequest);

        //  调用mongodb服务中的find方法
        //  传入上面的查询对象和Region的字节码对象
        //  返回一个满足条件的目的地对象的集合数据
        List<Region> regions = mongoTemplate.find(query, Region.class);

        //  返回一个PageImpl的集合
        //  传入一个满足条件的目的地对象的集合数据对象
        //  传入限制条件
        //  返回一个满足条件的总记录数
        return new PageImpl<>(regions, pageRequest, totalCount);
    }

    //  设置热门区域方法
    @Override
    public Region setHot(int hot, String id) {

        //  调本类的selectById方法通过id查询区域对象
        Region region = this.selectById(id);

        //  将传过来的hot设置到查询出来的区域对象
        region.setIshot(hot);

        //  调用本类的updateById方法进行修改
        this.updateById(region);

        //  返回region对象
        return region;
    }

    //  查询热门区域方法
    @Override
    public List<Region> queryIshot() {

        //  通过查询状态是热门的字段并进行序号的正序排序的条件
        //  进行热门区域的查询
        //  返回一个通过序号的正序且是热门的区域集合
        List<Region> list = regionRepository.findByIshotOrderBySequence(Region.STATE_HOT);

        //  返回list集合
        return list;
    }

}
